排序算法 Python 实现

归并排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def merge_sort(li):
# 不断递归调用自己一直到拆分成成单个元素的时候就返回这个元素,不再拆分了
if len(li) == 1:
return li

# 取拆分的中间位置
mid = len(li) // 2
# 拆分过后左右两侧子串
left = li[:mid]
right = li[mid:]

# 对拆分过后的左右再拆分 一直到只有一个元素为止
# 最后一次递归时候ll和lr都会接到一个元素的列表
# 最后一次递归之前的ll和rl会接收到排好序的子序列
ll = merge_sort(left)
rl = merge_sort(right)

# 我们对返回的两个拆分结果进行排序后合并再返回正确顺序的子列表
# 这里我们调用拎一个函数帮助我们按顺序合并ll和lr
return merge(ll, rl)

# 这里接收两个列表
def merge(left, right):
# 从两个有顺序的列表里边依次取数据比较后放入result
# 每次我们分别拿出两个列表中最小的数比较,把较小的放入result
result = []
while len(left) > 0 and len(right) > 0:
# 为了保持稳定性,当遇到相等的时候优先把左侧的数放进结果列表,因为left本来也是大数列中比较靠左的
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
# while循环出来之后 说明其中一个数组没有数据了,我们把另一个数组添加到结果数组后面
result += left
result += right
return result


if __name__ == '__main__':
li = [5, 4, 30, 2, 1]
li2 = merge_sort(li)
print(li2)

快速排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def QuickSort(arr, firstIndex, lastIndex):
if firstIndex < lastIndex:
divIndex = Partition(arr, firstIndex, lastIndex)

QuickSort(arr, firstIndex, divIndex)
QuickSort(arr, divIndex+1, lastIndex)
else:
return


def Partition(arr, firstIndex, lastIndex):
i = firstIndex-1
for j in range(firstIndex, lastIndex):
if arr[j] <= arr[lastIndex]:
i = i+1
arr[i], arr[j] = arr[j], arr[i]
arr[i+1], arr[lastIndex] = arr[lastIndex], arr[i+1]
return i


arr = [1, 4, 7, 1, 5, 5, 3, 85, 34, 75, 23, 75, 2, 0]

print("initial array:\n", arr)
QuickSort(arr, 0, len(arr)-1)
print("result array:\n", arr)

堆排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from collections import deque


def swap_param(L, i, j):
L[i], L[j] = L[j], L[i]
return L


def heap_adjust(L, start, end):
temp = L[start]

i = start
j = 2 * i

while j <= end:
if (j < end) and (L[j] < L[j + 1]):
j += 1
if temp < L[j]:
L[i] = L[j]
i = j
j = 2 * i
else:
break
L[i] = temp

def heap_sort(L):
L_length = len(L) - 1

first_sort_count = L_length / 2
for i in range(first_sort_count):
heap_adjust(L, first_sort_count - i, L_length)

for i in range(L_length - 1):
L = swap_param(L, 1, L_length - i)
heap_adjust(L, 1, L_length - i - 1)

return [L[i] for i in range(1, len(L))]

def main():
L = deque([50, 16, 30, 10, 60, 90, 2, 80, 70])
L.appendleft(0)
print heap_sort(L)


if __name__ == '__main__':
main()
0%